﻿using System.Collections.ObjectModel;

namespace Central.Linq {

	/// <summary>
	/// Класс предиката выборки коллекции полей
	/// </summary>
	public class SelectPredicate {

		/// <summary>
		/// Конструктор
		/// </summary>
		public SelectPredicate() {
			this.values = new Collection<object>();
		}

		/// <summary>
		/// Конструктор
		/// </summary>
		public SelectPredicate(string select, Collection<object> valueCollection) {
			this.Select = select;
			this.values = valueCollection;
		}

		/// <summary>
		/// Строка выборки коллекции полей
		/// </summary>
		public string Select { get; set; }

		private Collection<object> values;

		/// <summary>
		/// Коллекция значений строки выборки
		/// </summary>
		public Collection<object> Values {
			get {
				return this.values;
			}
		}

		#region [+] cвойства

		/// <summary>
		/// Количество заданных значений в строке выборки
		/// </summary>
		public int Count {
			get {
				return this.Values == null ? 0 : this.Values.Count;
			}
		}

		#endregion [+] cвойства

		#region методы

		/// <summary>
		/// Сравнение объектов
		/// </summary>
		/// <param name="obj"></param>
		/// <returns></returns>
		public override bool Equals(object obj) {
			return Equals(obj as SelectPredicate);
		}

		/// <summary>
		/// Сравнение объектов SelectPredicate
		/// </summary>
		/// <param name="other"></param>
		/// <returns></returns>
		public bool Equals(SelectPredicate other) {
			if (other == null)
				return false;
			return (other.Select.Equals(this.Select) && other.Values.Equals(this.Values));
		}

		/// <summary>
		/// Получение Hash кода объекта
		/// </summary>
		/// <returns></returns>
		public override int GetHashCode() {
			//Calculate the hash code
			return this.Select.GetHashCode() ^ this.Values.GetHashCode();
		}

		#endregion методы
	}
}